package com.atguigu.lease.common.context;

/**
 * @Author GQS @Date 2024/9/4/11:00 @Description
 */
/** LoginUserContext 类用于在登录上下文中管理用户信息，确保不同线程之间的用户信息隔离。 使用 ThreadLocal 存储用户信息，避免了线程安全问题。 */
public class LoginUserContext {
  /*
  ThreadLocal是Java中的一个非常特殊的类，它提供了线程局部变量，
  即每个线程访问该变量时都会有自己的一份独立初始化的变量副本，
  实现了线程间的数据隔离。这意味着，如果你定义了一个ThreadLocal变量，
  那么访问这个变量的每个线程都会有这个变量的本地副本，这有助于避免线程安全问题。
   */

  // 定义一个 ThreadLocal 变量来存储 LoginUser 对象，确保每个线程拥有独立的用户信息。
  private static final ThreadLocal<LoginUser> userThreadLocal = new ThreadLocal<>();

  /**
   * 设置当前线程的 LoginUser。
   *
   * @param loginUser 要设置的 LoginUser 对象，包含当前线程的用户信息。
   */
  public static void setLoginUser(LoginUser loginUser) {
    // 设置当前线程的用户信息为指定的 LoginUser 对象。
    userThreadLocal.set(loginUser);
  }

  /**
   * 获取当前线程的 LoginUser。
   *
   * @return 返回当前线程的 LoginUser 对象。
   */
  public static LoginUser getLoginUser() {
    // 返回当前线程的用户信息。
    return userThreadLocal.get();
    // 当线程通过ThreadLocal的get()方法访问变量时，
    // ThreadLocal会获取当前线程的ThreadLocalMap，并以自身作为key去查找对应的value
  }

  /** 清除当前线程的 LoginUser。 此方法主要用于释放资源，在当前线程结束或需要切换用户上下文时避免内存泄漏。 */
  public static void clear() {
    // 移除当前线程的用户信息，有效清除 LoginUser。
    userThreadLocal.remove();
  }
}
